--- title: "平均" created: 2025-11-28 tags: - 算法 --- # 平均 ## 题目 [平均](https://www.acwing.com/problem/content/5398/) ![[image-4d08e3f1.png]] ## 思路分析 若n=10 就要让0-9全都出现一次 若n为20 就1-9全出现两次 贪心策略1: 由n/10可以确定出各个数应该出现的次数 令其为mid 只存在大于mid的补给小于mid的 不存在大于mid补给大于mid 小于mid补给小于mid 小于mid补给大于mid的情况 所以只需要考虑所有大于mid的数 它们的花费代价 贪心策略2: 更改不同的数 花费的代价不同 优先更改花费小的数 问题解决 ## 代码实现 一开始不确定map能否嵌套优先队列 这代码给我写笑了 ```cpp #include using namespace std; priority_queue,greater> zero; priority_queue,greater> one; priority_queue,greater> two; priority_queue,greater> three; priority_queue,greater> four; priority_queue,greater> five; priority_queue,greater> six; priority_queue,greater> seven; priority_queue,greater> eight; priority_queue,greater> nine; int main() { int n;cin>>n; for(int i=0;i>a>>b; switch(a) { case 0:{ zero.push(b); break; } case 1:{ one.push(b); break; } case 2:{ two.push(b); break; } case 3:{ three.push(b); break; } case 4:{ four.push(b); break; } case 5:{ five.push(b); break; } case 6:{ six.push(b); break; } case 7:{ seven.push(b); break; } case 8:{ eight.push(b); break; } case 9:{ nine.push(b); break; } } } int mid=n/10; long long res=0; while(zero.size()>mid){ res+=zero.top(); zero.pop(); } while(one.size()>mid){ res+=one.top(); one.pop(); } while(two.size()>mid){ res+=two.top(); two.pop(); } while(three.size()>mid){ res+=three.top(); three.pop(); } while(four.size()>mid){ res+=four.top(); four.pop(); } while(five.size()>mid){ res+=five.top(); five.pop(); } while(six.size()>mid){ res+=six.top(); six.pop(); } while(seven.size()>mid){ res+=seven.top(); seven.pop(); } while(eight.size()>mid){ res+=eight.top(); eight.pop(); } while(nine.size()>mid){ res+=nine.top(); nine.pop(); } cout< using namespace std; map,greater>> pqmap; int main() { int n;cin>>n; for(int i=0;i>a>>b; pqmap[a].push(b); } int mid=n/10; long long res=0; for(auto &entry:pqmap){ auto &pq=entry.second; while(pq.size()>mid){ res+=pq.top(); pq.pop(); } } cout<